<?php
  /**
   * @author EVANDRO DE OLIVEIRA.
   * @category MODEL
   * @package MODELS.
   * @since 17/03/2012.
   * @last_update 24/03/2012.
   * @copyright 2012.
   * @version 1.0.
   *
   */
  class Application_Model_Modulos extends Zend_Db_Table_Abstract{
    const IND_ATIVO = 1;
    const IND_INATIVO = 0;
    
    /* Seta a tabela a ser usada*/
    protected function _setup(){
      $this->_name = 'modulos';
      
      parent::_setup();
    }
    
    /**
     * Retorna a string SELECT como todos os campos solicitados por parametro.
     * @param array Array com as opções de colunas e clausulá WHERE.
     *              Ex: Colunas:
     *                  $arrOptions['fields_perfil'] = array('campo1', 'campo2', 'campoN').
     *                  
     *                  WHERE
     *                    $arrOptions['where_clause'] = array('ds_peril' => 'usuario')
     * @param string  Comparação.Ex: =, LIKE NOT LIKE, etc  
     *                    
     * @return string                   
     */
    public function _get($arrOptions = array(), $strComparison = '='){
      $arrAlias     = array('m' => $this->_name);
      
      if(isset($arrOptions['fields']))
        $arrCols = $arrOptions['fields'];
      else
        $arrCols = array('m.*');
          
      $strSql = $this->getAdapter()
      ->select()
      ->from($arrAlias, $arrCols)
      ->where('m.ds_situacao = ?', self::IND_ATIVO)
      ;
      
      if(isset($arrOptions['where_clause']))
        foreach($arrOptions['where_clause'] as $strkey => $strValue)
          $strSql->where($strkey . $strComparison . ' ?', $strValue);  
      $strSql->order('m.idModulo');
      
      return $strSql;
    }
    
    /**
     * Retorna o registro
     * 
     * @param integer Id do registro
     * @return databasen result
     */
    public function get($intId = null){
      if($intId == null)
        return false;
      
      $arrOptions['fields'] = array(
        'm.idModulo',
        'm.ds_sigla',
        'm.ds_modulo',
        'm.ds_situacao'
      );
      
      $arrOptions['where_clause'] = array(
        'm.idModulo'  => $intId   
      );
      
      $strSql = $this->_get($arrOptions);  
        
      $objResult = $this->getAdapter()->fetchAll($strSql);
        
      return Core_Commons::onLoad($objResult);
    }
    
    public function getAtivos(){
      $strSql = $this->select()->where($this->_name . '.ds_situacao = ?', self::ATIVO);
      
      $objResult = $this->fetchAll($strSql);
      
      return Core_Commons::onLoad($objResult);
    }
    
    /**
     * 
     * @return database
     */
    public function getById($intId){
    	$arrAliasPrecos  = array('p' => 'precos');
    	$arrColsPrecos   = array();
    	
    	$arrOptions['fields'] = array(
        'm.idModulo',
        'm.ds_sigla',
        'm.ds_modulo',
        'm.ds_situacao',
    	  'm.nr_carga_horaria_modulo', 
    	  'm.dt_insercao',
        'm.dt_atualizacao',  
    	  'p.idPreco',
    	  'p.nr_valor_final'
      );
      
      $arrOptions['where_clause'] = array(
        'm.idModulo'  => $intId, 
      );
        
      $strSql = $this->_get($arrOptions)
      ->join($arrAliasPrecos, 'p.idPreco = m.idPreco', $arrColsPrecos)
      ;
      
      $objResult = $this->getAdapter()->fetchRow($strSql);
      
      return Core_Commons::onLoad($objResult);
    }
    
    /**
     * Retorna o resultado de acordo com o nome. 
     * 
     * @param string  Nome do menu
     * @param string  Nome da controller
     * 
     * @return database_result
     */
    public function getByNomeESigla($strDs, $strDs2){  
      $arrOptions['fields'] = array(
        'm.idModulo',
        'm.ds_sigla',
        'm.ds_modulo',
        'c.idCurso',
        'c.ds_curso',
        'm.ds_situacao'
          
      );
      
      if($strDs && $strDs2){ 
        $arrOptions['where_clause'] = array(
          'm.ds_sigla'  => '%' . $strDs . '%', 
          'm.ds_modulo' => '%' . $strDs2 . '%'      
        );   
        
        $strComparison = ' LIKE ';
      }  
      elseif($strDs && !$strDs2){ 
        $arrOptions['where_clause'] = array(
          'm.ds_sigla'  => '%' . $strDs . '%'
        );
        
        $strComparison = ' LIKE ';
      }  
      elseif(!$strDs && $strDs2){ 
        $arrOptions['where_clause'] = array(
          'm.ds_modulo' => '%' . $strDs2 . '%'      
        );
        
        $strComparison = ' LIKE ';
      }  
      else{
        $arrOptions['where_clause'] = array(
          1  => 1, 
        );
        
        $strComparison = ' = ';
      }
      
      $strSql = $this->_get($arrOptions, $strComparison)
      ->join(array('c' => 'cursos'), 'c.idCurso = m.idCurso', array())
      ;
      $objResult = $this->getAdapter()->fetchAll($strSql);            
      return Core_Commons::onLoad($objResult);
    }
    
    public function getByCurso($intIdCurso){
      $arrOptions['fields'] = array(
        'm.idModulo',
        'm.ds_modulo',
      );
      
      $arrOptions['where_clause'] = array(
        'm.idCurso'  => $intIdCurso,
      );
      
      $strSql = $this->_get($arrOptions); 
      $objResult = $this->getAdapter()->fetchAll($strSql);
        
      return Core_Commons::onLoad($objResult);
    }
    
  /**
     * Realiza a validação dos dados vindo do formulário
     * 
     * @return void.
     */
    public function validaForm(){
      $objValida = new Core_ValidaFormulario();
      $arrFilters = array('*' =>  'StringTrim');
      $arrOptions = array('allowEmpty' =>  true);
      
      $arrValidators = array(
        'Sigla'         =>  array('allowEmpty'  => false, 'fields' => 'ds_sigla'),
        'Módulo'        =>  array('allowEmpty'  => false, 'fields' => 'ds_modulo'),
        'Curso'         =>  array('allowEmpty'  => false, 'fields' => 'idCurso'),
        'Preço'         =>  array('allowEmpty'  => false, 'fields' => 'idPreco'),
        'Carga Horária' =>  array('allowEmpty'  => false, 'fields' => 'nr_carga_horaria_modulo'),
        'Situaçao'      =>  array('allowEmpty'  => false, 'fields' => 'ds_situacao'),
        'Inserção'      =>  array('allowEmpty'  => false, 'fields' => 'dt_insercao'),
      );
      
      return $objValida->validaFormulario($arrFilters, $arrValidators, $arrOptions);;
    }
    
    /**
     * Salva um registro. Funcionalidade para inserção e atualização
     * @param integer Id do registro. Se for diferente de null, então será atualizado o regsitro
     * a partir do id, senão será inserido um novo registro.
     * 
     * @return boolean.
     */
    public function salvar($intId = null){
      $objValida = new Core_ValidaFormulario();
      $objDadosInput = $this->validaForm();
                              
      $arrDados['ds_sigla']                 = strtoupper($objDadosInput->ds_sigla);
      $arrDados['ds_modulo']                = ucfirst($objDadosInput->ds_modulo);
      $arrDados['idPreco']                  = $objDadosInput->idPreco;
      $arrDados['idCurso']                  = $objDadosInput->idCurso;
      $arrDados['nr_carga_horaria_modulo']  = $objDadosInput->nr_carga_horaria_modulo;
      $arrDados['ds_situacao']              = $objDadosInput->ds_situacao;
            
      if($intId == null){
        $arrDados['dt_insercao']    = date('Y-m-d H:i:s');
        $arrDados['dt_atualizacao'] = 'NULL';
            
        $strSql = $this->select()
        ->where("ds_sigla = ?", $arrDados['ds_sigla'])
        ->where("ds_modulo = ?", $arrDados['ds_modulo'])
        ;
        
        if($this->fetchAll($strSql)->current())
          throw new Exception(
            'Módulo já cadastrado com o nome "' . 
            $arrDados['ds_modulo'] . 
            '" ou com a sigla "' . 
            $arrDados['ds_sigla'] . 
            '"!', '3'
          );
        else{
          return $this->insert($arrDados);
        }  
      }
      else{ 
        $arrDados['dt_atualizacao'] = date('Y-m-d H:i:s');
        
        return $this->update($arrDados, 'idModulo = ' . $intId);  
      }
    }
    
    /**
     * Exclui um registro  a partir do banco de dados.
     * Um registro nunca será ecluido do banco de dados.
     * Considera-se excluído um registro com status igual a "0".
     * 
     * @param integer  id para a clausula where.
     * @return boolean.
     */
    public function excluir($intId){
      $boolReturn = false;
      $objDadosInput = $this->validaForm();
      
      $strWhere = "idModulo = '" . $intId . "'";
      $arrDados['ds_situacao'] = self::IND_INATIVO; 
      $arrDados['dt_atualizacao'] = date('Y-m-d H:i:s');
            
      if($this->update($arrDados, $strWhere))  
        $boolReturn = true;
      
      return $boolReturn; 
      
    }
  }  